package com.irving;

public class DoubleCheckLazySingleton {
    //由于JVm的指令重排序优化，2和3的顺序可能会颠倒 变成132
    //volatile可以保证指令不会被重排序
    private volatile static DoubleCheckLazySingleton instance = null;

    private DoubleCheckLazySingleton(){}

    public static DoubleCheckLazySingleton getInstance(){
        if (null == instance){
            synchronized (DoubleCheckLazySingleton.class){
                //这个判断的作用：当线程A获的锁进入，线程B监听状态
                //当线程A走到end位置时，线程B马上获取到锁进入
                //若没有判断  线程B也会new一个对象
                if (null == instance){
                    instance = new DoubleCheckLazySingleton();
                    //1、分配内存地址
                    //2、初始化
                    //3、instance指向分配的内存地址
                }
            }
            //end
        }
        return instance;
    }
}
